package com.aviator.executor;

import com.googlecode.aviator.AviatorEvaluator;

/**
 * @Author: Jiangxx
 * @Date: 2021/12/30
 * @Description: lambda函数定义
 */
public class AviatorExecutor03 {

    public static void main(String[] args) {

        /**
         * lambda函数定义：从 4.0.0 开始， aviator 支持通过 lambda 关键字定义一个匿名函数，并且支持闭包捕获；
         * 匿名函数的基本定义形式是：lambda (参数1,参数2...) -> 参数体表达式 end
         */
        Long result1 = (Long) AviatorEvaluator.exec("(lambda (x,y) -> x + y end)(x,y)", 1, 2);

        /* 匿名函数可以作为参数使用，也可以作为结果返回 */
        /* 我们定义了一个函数，它接收参数 x，然后返回了一个新的函数，这个新函数接收参数 y，新返回的又是另一个新函数，
        最后这个新函数接收参数 z，并且将 x+y+z　三个参数求和并返回。假设这个匿名函数”名称“为s，那么上述表达式的调用结果等价于 s(1)(2)(3)，
        最终就是 1+2+3。*/
        Long result2 = (Long) AviatorEvaluator.exec("(lambda (x) -> lambda(y) -> lambda(z) -> x + y + z end end end)(1)(2)(3)");

        System.out.println(result1); //3
        System.out.println(result2); //6
    }
}
